package tcp;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
import model.TCPModelRoboter;
import org.apache.log4j.Logger;
import tcpVerbindung.SendenString;
import tcpVerbindung.utils;

public class TCProboter {
	
	private Logger logger = Logger.getLogger(getClass());
	private TCPModelRoboter model;
	private Thread thEmpfangen;
	private Thread thSenden;
	private String ip = "192.168.1.10";

	private int port = 8210;
	private Socket socket;
	private boolean verbindungAufgebaut;
	private boolean abwechseln;

	/**
	 * 
	 * @param tcpModelRoboter
	 */
	public TCProboter(TCPModelRoboter tcpModelRoboter) {
		this.model = tcpModelRoboter;

		abwechseln = false;

		socket = new Socket();

		// Empfangen
		thEmpfangen = new Thread(new Runnable() {
			public void run() {
				while (true) {
					tcpEmpfangen();
					try {
						Thread.sleep(25L);
					} catch (InterruptedException e) {
						logger.warn("TCPRoboter", e);
					}
				}
			}
		});
		
		// Senden
		thSenden = new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 2;) {
					if (!abwechseln) {
						tcpSenden();
					}
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						logger.warn("TCPRoboter", e);
					}
				}
			}
		});
		tcpAufbauen();
	}

	/**
	 * 
	 */
	private void tcpAufbauen() {
		try {
			socket = utils.verbindungAufbauen(ip, port);

			verbindungAufgebaut = true;
		} catch (UnknownHostException e) {
			logger.warn("Es konnte keine Verbindung zum Roboter aufgebaut werdenS", e);

			String message = "Es konnte keine Verbindung zum Roboter aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;
		} catch (IOException e) {
			logger.warn("Es konnte keine Verbindung zum Roboter aufgebaut werden", e);

			String message = "Es konnte keine Verbindung zum Roboter aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;
		}

		if (verbindungAufgebaut) {
			logger.info("Verbindung zum Roboter aufgebaut");

			thEmpfangen.start();
			thSenden.start();
		}
	}

	/**
	 * 
	 */
	private void tcpSenden() {
		try {
			SendenString.datenSenden(socket, model.datenSenden());

			abwechseln = true;
		} catch (IOException e) {
			logger.warn("Es konnte keine Verbindung zum Roboter aufgebaut werden", e);
		}
	}

	/**
	 * 
	 */
	private void tcpEmpfangen() {
		try {
			model.empfangen(utils.datenSplit(utils.datenEmpfangen(socket, 500), ";"));

			abwechseln = false;
		} catch (IOException e) {
			logger.warn("Es konnte keine Verbindung zum Roboter aufgebaut werden", e);

			String message = "Es konnte keine Verbindung zum Roboter aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}
	}
}